/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package miage.sessions.persistant;

import java.rmi.RemoteException;
import java.util.List;
import javax.ejb.FinderException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import miage.beans.MagasinPresentation;
import miage.beans.ProduitPresentation;
import miage.entities.Magasin;
import miage.entities.Produit;

/**
 *
 * @author Pepito
 */
@Stateless
public class ProductFacade implements ProductFacadeLocal {
    
    private AccountProductStoreFacade apsf;
   
    @PersistenceContext
    private EntityManager em;
    
    @Override
    public List<Produit> getAllProduct()throws FinderException, RemoteException {
        
        Query query = em.createNamedQuery("Produit.findAll");
        List<Produit> allProducts = query.getResultList();
        return allProducts;
    }
    @Override
    public List<String> getAllCategorieOfProduct() throws FinderException, RemoteException {
        List<String> allCategories = (List<String>) em.createNamedQuery("Produit.findAllCategorie").getResultList();
        return allCategories;
    }
    
    @Override
    public List<Produit> getAllProductByCategorie(String categorie)throws FinderException, RemoteException {
        return (List<Produit>) em.createNamedQuery("Produit.findByCategorieProduit").setParameter("categorieProduit", categorie).getResultList();
    }
     
    @Override
    public List<Produit> getAllProductByPrix(double prixmax)throws FinderException, RemoteException {
        return (List<Produit>) em.createNamedQuery("Produit.findByPrixProduit").setParameter("prixProduit", prixmax).getResultList();
        
    }
    
     @Override
    public List<Produit> getAllProductByPrixMax(double prixmax)throws FinderException, RemoteException {
        return (List<Produit>) em.createNamedQuery("Produit.findByPrixProduitMax").setParameter("prixProduit", prixmax).getResultList();
        
    }
    
    
    @Override
    public List<Produit> getAllProduitByMagasin(String reference_store)throws FinderException, RemoteException {
        Magasin m = (Magasin) em.createNamedQuery("Magasin.findByReferenceStore").setParameter("referenceStore", reference_store).getSingleResult();
        //Magasin m = em.find(Magasin.class, reference_store);
        if (m!=null) System.out.println("le magasin existe");
        else System.out.println("le magasin n'existe pas");
        //String referenceStore=m.getReferenceStore();
        //System.out.println(referenceStore);
        List<Produit> prod =  em.createNamedQuery("Produit.findByReferenceMagasin").setParameter("referenceStore", m).getResultList();
        for(Produit cust:prod ) {
            System.out.println(cust.getNomProduit());
        }
        return prod;
    }
    @Override
    public List<Produit> getProduitByName(String nom_produit)throws FinderException, RemoteException {
        List<Produit> p = em.createNamedQuery("Produit.findByNomProduit").setParameter("nomProduit", "%" + nom_produit.toLowerCase() + "%").getResultList();
        System.out.println("produit find by nom Produit");
        for(Produit cust:p){
            System.out.println("liste de produit :"+cust.toString());
        }
        return p;
    }
    
    public Produit getProduitByName(String nom_produit, String bean)throws FinderException, RemoteException {
       return (Produit) em.createNamedQuery("Produit.findByNomProduit").setParameter("nomProduit", nom_produit.toLowerCase()).getSingleResult();
        
    }
    @Override
    public Produit getProduitByReferenceProduit(String reference_produit)throws FinderException, RemoteException {
        return (Produit) em.find(Produit.class, reference_produit);//, this) /em.createNamedQuery("Produit.findByReferenceProduit").setParameter("referenceProduit", reference_produit);
    }
    
    @Override
    public void addNewProduit(MagasinPresentation magasin, ProduitPresentation produit)throws FinderException, RemoteException {        
        System.out.println("addnewproduit");
        Magasin unMagasin = apsf.getMagasin(magasin.getReference_store());
        if(unMagasin == null)
        {
            System.out.println("le magsin n'existe pas");
            apsf.addMagasin(magasin);
            unMagasin = apsf.getMagasin(magasin.getReference_store());
        }
        System.out.println("le magsin existe");
        Produit p = new Produit();
        p.setCategorieProduit(produit.getCategorieProduit());
        p.setDescriptionProduit(produit.getDescriptionProduit());
        p.setImageProduit(produit.getImageProduit());
        p.setNomProduit(produit.getNom_produit());
        p.setPrixProduit(produit.getPrix_produit());
        p.setQuantite(produit.getQuantite());
        p.setReferenceProduit(produit.getReference_produit());
        p.setReferenceStore(unMagasin);
        em.persist(p);
    }
    /*
     * ne peut pas modifier le magasin de référencement du produit
     */
    @Override
    public void updateProduit(ProduitPresentation produit)throws FinderException, RemoteException {
        Produit p = new Produit();
        p.setDescriptionProduit(produit.getDescriptionProduit());
        p.setImageProduit(produit.getImageProduit());
        p.setNomProduit(produit.getNom_produit());
        p.setPrixProduit(produit.getPrix_produit());
        p.setQuantite(produit.getQuantite());
        p.setCategorieProduit(produit.getCategorieProduit());
        p.setReferenceProduit(produit.getReference_produit());
        em.merge(p);
    }
    
    @Override
    public void updateProduit(Produit produit)throws FinderException, RemoteException {
        
        em.merge(produit);
    } 
    @Override
    public void deleteProduit(String reference_produit)throws FinderException, RemoteException {
        Produit produit = this.getProduitByReferenceProduit(reference_produit);
        em.remove(produit);
    }
}
